﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace CentroVentas.Clases.Funciones.Venta
{
    class Venta
    {
        private List<DetalleVenta> detalle;

        public Venta(){
            detalle = new List<DetalleVenta>();
        }

        private int _vendedor;

        public int Vendedor
        {
            get { return _vendedor; }
            set { _vendedor = value; }
        }

        private DateTime _dateFechaHoraInicio;

        public DateTime FechaHoraInicio
        {
            get { return _dateFechaHoraInicio; }
            set { _dateFechaHoraInicio = value; }
        }

        private DateTime _fechaHoraFin;

        public DateTime FechaHoraFin
        {
            get { return _fechaHoraFin; }
            set { _fechaHoraFin = value; }
        }

        private string _tipoDocumento;

        public string TipoDocumento
        {
            get { return _tipoDocumento; }
            set { _tipoDocumento = value; }
        }

        private string _cliente;

        public string Cliente
        {
            get { return _cliente; }
            set { _cliente = value; }
        }

        private bool _despacho;

        public bool Despacho
        {
            get { return _despacho; }
            set { _despacho = value; }
        }

        private string _ciudad;

        public string Ciudad
        {
            get { return _ciudad; }
            set { _ciudad = value; }
        }

        private string _direccion1Despacho;

        public string Direccion1Despacho
        {
            get { return _direccion1Despacho; }
            set { _direccion1Despacho = value; }
        }

        private string _direccion2Despacho;

        public string Direccion2Despacho
        {
            get { return _direccion2Despacho; }
            set { _direccion2Despacho = value; }
        }

        private DateTime _fechaHoraDespacho;

        public DateTime FechaHoraDespacho
        {
            get { return _fechaHoraDespacho; }
            set { _fechaHoraDespacho = value; }
        }

        private string _comentarioDespacho;

        public string ComentarioDespacho
        {
            get { return _comentarioDespacho; }
            set { _comentarioDespacho = value; }
        }

        private string _rutReceptor;

        public string RutReceptor
        {
            get { return _rutReceptor; }
            set { _rutReceptor = value; }
        }

        private string _nombreReceptor;

        public string NombreReceptor
        {
            get { return _nombreReceptor; }
            set { _nombreReceptor = value; }
        }

        private long _valorDespacho;

        public long ValorDespacho
        {
            get { return _valorDespacho; }
            set { _valorDespacho = value; }
        }

        private long _subTotal;

        public long SubTotal
        {
            get { return _subTotal; }
            set { _subTotal = value; }
        }

        private long _iva;

        public long Iva
        {
            get { return _iva; }
            set { _iva = value; }
        }

        private double _descuento;

        public double Descuento
        {
            get { return _descuento; }
            set { _descuento = value; }
        }

        private double _total;
        public int IdVenta;

        public double Total
        {
            get { return _total; }
            set { _total = value; }
        }

        public void agregarProducto(int idProducto,int cantidad, double precioUnidad,int idPrecio)
        {
            DetalleVenta prod = new DetalleVenta();
            prod.IdProd = idProducto;
            prod.Cantidad = cantidad;
            prod.PrecioUnidad = precioUnidad;
            prod.IdPrecio = idPrecio;
            detalle.Add(prod);
        }

        public void eliminarProducto(int idProducto)
        {
            foreach (DetalleVenta prod in detalle)
            {
                if (prod.IdProd.ToString().Contains(idProducto.ToString()))
                {
                    detalle.Remove(prod);
                }
            }
        }
        
        public bool existeProducto(int idProducto)
        {
            foreach (DetalleVenta producto in detalle)
            {
                if (producto.IdProd.ToString().Contains(idProducto.ToString()))                
                    return true;                
            }
            return false;
        }

        public void modificarProducto(int idProducto, int cantidad, double precioUnidad)
        {
            foreach (DetalleVenta producto in detalle)
            {
                if (producto.IdProd.ToString().Contains(idProducto.ToString()))
                {
                    producto.Cantidad = cantidad;
                    producto.PrecioUnidad = precioUnidad;
                }
            }
        }

        public List<DetalleVenta> GetDetalle
        {
            get { return detalle; }
        }

        public bool CrearVenta(int IdUsuario)
        {
            try
            {
                DataBase db = DataBase.GetInstance();
                db.dadap.InsertCommand = new SqlCommand("INSERT INTO venta VALUES(@fechaventa,@tipodoc,@docu,@usu,1,@fechaPago,@tipopago,@comentario)", db.Conn);
                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@fechaventa", SqlDbType.DateTime2)).Value = DateTime.Now;
                if (TipoDocumento == "BOLETA")
                {
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@tipodoc", SqlDbType.Int)).Value = 1;
                }
                else
                {
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@tipodoc", SqlDbType.Int)).Value = 2;
                }

                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@docu", SqlDbType.VarChar)).Value = UltimaVenta();
                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@usu", SqlDbType.Int)).Value = IdUsuario;
                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@fechaPago", SqlDbType.DateTime2)).Value = DateTime.Now;
                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@tipopago", SqlDbType.Int)).Value = 1;
                db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@comentario", SqlDbType.VarChar)).Value = "";
                db.dadap.InsertCommand.ExecuteNonQuery();


                int IDUV = IdUltimaVenta();
                foreach (DetalleVenta prod in detalle)
                {
                    db.dadap.InsertCommand = new SqlCommand("INSERT INTO detalleVenta VALUES(@idPrecio,@idVenta,@Cantidad,@Descuento)", db.Conn);
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@idPrecio", SqlDbType.Int)).Value = prod.IdPrecio;
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@idVenta", SqlDbType.Int)).Value = IDUV;
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@Cantidad", SqlDbType.Int)).Value = prod.Cantidad;
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@Descuento", SqlDbType.Int)).Value = 0;

                    db.dadap.InsertCommand.ExecuteNonQuery();
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
            
        }

        private string UltimaVenta()
        {
            try
            {
                DataSet ds = new DataSet();
                DataBase db = DataBase.GetInstance();
                db.dadap.SelectCommand = new SqlCommand("SELECT COUNT(id) FROM VENTA", db.Conn);
                db.dadap.Fill(ds, "COUNT");
                return ds.Tables[0].Rows[0].ItemArray[0].ToString().PadLeft(8, '0');
            }
            catch (Exception)
            {
                return "ERROR";
            }
        }

        public int IdUltimaVenta()
        {
            try
            {
                DataSet ds = new DataSet();
                DataBase db = DataBase.GetInstance();
                db.dadap.SelectCommand = new SqlCommand("SELECT id FROM venta ORDER BY id DESC", db.Conn);
                db.dadap.Fill(ds, "id");
                return Convert.ToInt32(ds.Tables[0].Rows[0].ItemArray[0].ToString());
            }
            catch (Exception)
            {
                return 0;
            }        
        }
    }
}
